--- 模块功能：完善luat的c库接口
-- @module clib
-- @author openLuat
-- @license MIT
-- @copyright openLuat
-- @release 2017.9.20
module(..., package.seeall)
local uartReceiveCallbacks = {}
local uartSentCallbacks = {}
uartSta = {uart1={open=false, baud=0}, uart2={open=false, baud=0}}

--- 注册串口事件的处理函数
-- @number id 串口ID: 1表示串口1，2表示串口2，uart.ATC表示虚拟AT口
-- @string event 串口事件:
-- "recieve"表示串口收到数据，注意：使用uart.setup配置串口时，第6个参数设置为nil或者0，收到数据时，才会产生"receive"事件
-- "sent"表示串口数据发送完成，注意：使用uart.setup配置串口时，第7个参数设置为1，调用uart.write接口发送数据之后，才会产生"sent"事件
-- @function[opt=nil] callback 串口事件的处理函数
-- @return nil
-- @usage
-- uart.on(1,"receive",rcvFnc)
-- uart.on(1,"sent",sentFnc)
uart.on = function(id, event, callback)
    if event == "receive" then
        uartReceiveCallbacks[id] = callback
    elseif event == "sent" then
        uartSentCallbacks[id] = callback
    end
end

rtos.on(rtos.MSG_UART_RXDATA, function(id, length)
    if uartReceiveCallbacks[id] then
        uartReceiveCallbacks[id](id, length)
    end
end)

rtos.on(rtos.MSG_UART_TX_DONE, function(id)
    if uartSentCallbacks[id] then
        uartSentCallbacks[id](id)
    end
end)

--打开串口（动态切换波特率）
--1200，2400，4800，9600，10400，14400，19200，28800，38400，57600，115200，230400，460800，921600
function uartSetup(uid, baud)
	if (uid==1 and uartSta.uart1.open) or (uid==2 and uartSta.uart2.open) then
		uart.close(uid)
	end
	
	uart.setup(uid, baud, 8, uart.PAR_NONE, uart.STOP_1, nil, 1)
	
	uartSta.uart1.open= uid==1 and true or uartSta.uart1.open
	uartSta.uart1.baud= uid==1 and baud or uartSta.uart1.baud
	uartSta.uart2.open= uid==2 and true or uartSta.uart2.open
	uartSta.uart2.baud= uid==2 and baud or uartSta.uart2.baud
	
	log.info("setup.uart", "setup", uid, baud)
end
--动态切换波特率测试代码
--[[sys.taskInit(function()
	while true do
		setupUart(1,9600)
		sys.wait(10000)
		setupUart(1,115200)
		sys.wait(10000)
	end
end)]]

--配置关闭串口
function uartClose(uid)
	if (uid==1 and uartSta.uart1.open) or (uid==2 and uartSta.uart2.open) then
		uart.close(uid)
	end
	
	uartSta.uart1.open= uid==1 and false or uartSta.uart1.open
	uartSta.uart1.baud= uid==1 and 0 or uartSta.uart1.baud
	uartSta.uart2.open= uid==2 and false or uartSta.uart2.open
	uartSta.uart2.baud= uid==2 and 0 or uartSta.uart2.baud
	
	log.info("close.uart", "close", uid)
end

function uartStatus()
	return uartSta
end

